/******************************************************************************* * Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.fanfou.app.opensource.util; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpVersion; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.params.HttpClientParams; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.params.ConnPerRouteBean; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import com.fanfou.app.opensource.AppContext; import com.fanfou.app.opensource.http.SimpleRequestParam; import com.fanfou.app.opensource.http.support.GzipRequestInterceptor; import com.fanfou.app.opensource.http.support.GzipResponseInterceptor; import com.fanfou.app.opensource.http.support.RequestRetryHandler; /** * @author mcxiaoke * @version 1.0 2011.12.02 * @version 1.1 2011.12.07 * @version 1.2 2011.12.12 * @version 1.3 2011.12.21 * @version 1.4 2013.03.16 * */ public final class NetworkHelper { private static final String TAG = NetworkHelper.class.getSimpleName(); public static final int SOCKET_BUFFER_SIZE = 8 * 1024; public static final int CONNECTION_TIMEOUT_MS = 20000; public static final int SOCKET_TIMEOUT_MS = 20000; public static final int MAX_TOTAL_CONNECTIONS = 20; public static final int MAX_RETRY_TIMES = 3; private static final String WIFI = "WIFI"; private static final String MOBILE_CTWAP = "ctwap"; private static final String MOBILE_CMWAP = "cmwap"; private static final String MOBILE_3GWAP = "3gwap"; private static final String MOBILE_UNIWAP = "uniwap"; /** * 根据当前网络状态填充代理 * * @param context * @param httpParams */ private static final void checkAndSetProxy(final Context context, final HttpParams httpParams) { boolean needCheckProxy = true; final ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if ((networkInfo == null) || NetworkHelper.WIFI.equalsIgnoreCase(networkInfo .getTypeName()) || (networkInfo.getExtraInfo() == null)) { needCheckProxy = false; } if (needCheckProxy) { final String typeName = networkInfo.getExtraInfo(); if (NetworkHelper.MOBILE_CTWAP.equalsIgnoreCase(typeName)) { final HttpHost proxy = new HttpHost("10.0.0.200", 80); httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); } else if (NetworkHelper.MOBILE_CMWAP.equalsIgnoreCase(typeName) || NetworkHelper.MOBILE_UNIWAP.equalsIgnoreCase(typeName) || NetworkHelper.MOBILE_3GWAP.equalsIgnoreCase(typeName)) { final HttpHost proxy = new HttpHost("10.0.0.172", 80); httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); } } // String defaultProxyHost = android.net.Proxy.getDefaultHost(); // int defaultProxyPort = android.net.Proxy.getDefaultPort(); // if (defaultProxyHost != null && defaultProxyHost.length() > 0 // && defaultProxyPort > 0) { // HttpHost proxy = new HttpHost(defaultProxyHost, defaultProxyPort); // httpParams.setParameter(ConnRouteParams.DEFAULT_PROXY, proxy); // } } public final static DefaultHttpClient createHttpClient(final Context context) { final HttpParams params = NetworkHelper.createHttpParams(); final DefaultHttpClient client = new DefaultHttpClient(params); client.addRequestInterceptor(new GzipRequestInterceptor()); client.addResponseInterceptor(new GzipResponseInterceptor()); client.setHttpRequestRetryHandler(new RequestRetryHandler( NetworkHelper.MAX_RETRY_TIMES)); NetworkHelper.checkAndSetProxy(context, params); return client; } private static final HttpParams createHttpParams() { final HttpParams params = new BasicHttpParams(); HttpProtocolParams.setUseExpectContinue(params, false); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); ConnManagerParams.setTimeout(params, NetworkHelper.SOCKET_TIMEOUT_MS); HttpConnectionParams.setConnectionTimeout(params, NetworkHelper.CONNECTION_TIMEOUT_MS); HttpConnectionParams.setSoTimeout(params, NetworkHelper.SOCKET_TIMEOUT_MS); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(NetworkHelper.MAX_TOTAL_CONNECTIONS)); ConnManagerParams.setMaxTotalConnections(params, NetworkHelper.MAX_TOTAL_CONNECTIONS); HttpConnectionParams.setStaleCheckingEnabled(params, false); HttpConnectionParams.setTcpNoDelay(params, true); HttpConnectionParams.setSocketBufferSize(params, NetworkHelper.SOCKET_BUFFER_SIZE); HttpClientParams.setRedirecting(params, false); HttpProtocolParams.setUserAgent(params, "FanFou for Android/" + AppContext.appVersionName); return params; } private static String encode(final String input) { try { return URLEncoder.encode(input, HTTP.UTF_8); } catch (final UnsupportedEncodingException e) { } return input; } public static MultipartEntity encodeMultipartParameters( final List<SimpleRequestParam> params) { if (CommonHelper.isEmpty(params)) { return null; } final MultipartEntity entity = new MultipartEntity(); try { for (final SimpleRequestParam param : params) { if (param.isFile()) { entity.addPart(param.getName(), new FileBody(param.getFile())); } else { entity.addPart( param.getName(), new StringBody(param.getValue(), Charset .forName(HTTP.UTF_8))); } } } catch (final UnsupportedEncodingException e) { e.printStackTrace(); } return entity; } public static HttpEntity encodePostParameters( final List<SimpleRequestParam> params) { HttpEntity entity = null; if (!CommonHelper.isEmpty(params)) { try { entity = new UrlEncodedFormEntity(params, HTTP.UTF_8); } catch (final UnsupportedEncodingException e) { } } return entity; } public static String encodeQueryParameters( final List<SimpleRequestParam> params) { if (CommonHelper.isEmpty(params)) { return ""; } final StringBuilder sb = new StringBuilder(); for (int i = 0; i < params.size(); i++) { final SimpleRequestParam p = params.get(i); if (p.isFile()) { throw new IllegalArgumentException("GET参数不能包含文件"); } if (i > 0) { sb.append("&"); } sb.append(NetworkHelper.encode(p.getName())).append("=") .append(NetworkHelper.encode(p.getValue())); } return sb.toString(); } public static final boolean isConnected(final Context context) { final ConnectivityManager connec = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo info = connec.getActiveNetworkInfo(); return (info != null) && info.isConnectedOrConnecting(); } public static final boolean isNotConnected(final Context context) { return !NetworkHelper.isConnected(context); } public static final boolean isWifi(final Context context) { final ConnectivityManager connec = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo info = connec.getActiveNetworkInfo(); return (info != null) && (info.getType() == ConnectivityManager.TYPE_WIFI); } }